package com.hunttown.mes.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * created by hunttown on 2017-07-28
 */
public class DateConvertUtils {

    /**
     * 日期转换为"年-月-日"
     *
     * @param date 日期
     * @return 年-月-日
     */
    public static String dateToChineseStr(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
        return format.format(date);
    }

    /**
     * 日期转换成字符串
     *
     * @param date 要转换的日期
     * @return "2017-07-28 10:25:30"
     */
    public static String dateToStr(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(date);
    }

    /**
     * 日期转成短日期字符串
     *
     * @param date 要转换的日期
     * @return "2017-07-28"
     */
    public static String dateToShortStr(Date date) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        return df.format(new Date(date.getTime()));
    }

    /**
     * 日期转成短日期字符串
     *
     * @param date 要转换的日期
     * @return "2017-07"
     */
    public static String dateToYearMonth(Date date) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM");

        return df.format(new Date(date.getTime()));
    }

    /**
     * 日期转化成短日期
     *
     * @param date 要转换的日期
     * @return 2017-07-28
     */
    public static Date dateToShortDate(Date date) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date dt;
        try {
            dt = df.parse(dateToShortStr(date));
            return dt;
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 字符串转换成日期
     *
     * @param datestr 要转换的日期
     * @return 2018-07-28
     */
    public static Date strToDate(String datestr) {
        datestr = complementDate(datestr);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = null;
        try {
            dt = format.parse(datestr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dt;
    }

    /**
     * 字符串转换成短日期
     *
     * @param datestr 要转换的日期
     * @return "2018-07-28"
     */
    public static Date strToShortDate(String datestr) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = null;
        try {
            dt = format.parse(datestr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dt;
    }

    /**
     * 字符串转短日期格式
     *
     * @param datestr 要转换的日期
     * @return "2018-07-28"
     */
    public static String strToShortStrDate(String datestr) {
        datestr = complementDate(datestr);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = null;
        try {
            dt = format.parse(datestr);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        if (dt == null) {
            return "";
        }

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        return df.format(new Date(dt.getTime()));
    }

    /**
     * GMT 日期转 Date 日期
     *
     * @param gmtdate 日期
     * @return Date
     */
    public static String gmtToStrDate(String gmtdate) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US);
            Date date = sdf.parse(gmtdate);
            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            return sdf.format(date);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * GMT 日期转 Date 短日期
     *
     * @param gmtdate 日期
     * @return Date
     */
    public static String gmtToShortStrDate(String gmtdate) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US);
            Date date = sdf.parse(gmtdate);
            sdf = new SimpleDateFormat("yyyy-MM-dd");

            return sdf.format(date);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * CST 日期转 Date 日期
     *
     * @param gmtdate 日期
     * @return Date
     */
    public static String cstToStrDate(String gmtdate) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
            Date date = sdf.parse(gmtdate);
            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            return sdf.format(date);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * CST 日期转 Date 短日期
     *
     * @param gmtdate 日期
     * @return Date
     */
    public static String cstToShortStrDate(String gmtdate) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
            Date date = sdf.parse(gmtdate);
            sdf = new SimpleDateFormat("yyyy-MM-dd");

            return sdf.format(date);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 获取N天前的短日期时间
     *
     * @param days 天数
     * @return "2018-08-28"
     */
    public static String getShortDateBeforeDays(int days) {
        Date dt = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        return df.format(new Date(dt.getTime() - days * 24 * 60 * 60 * 1000));
    }

    /**
     * 获取过去第几天的日期
     *
     * @param days 天数
     * @return "2018-08-28"
     */
    public static String getPastDate(int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        return format.format(today);
    }

    /**
     * 获取指定日期 过去第几天的日期
     *
     * @param date 短日期
     * @param days 天数
     * @return 短日期
     */
    public static String getPastDateAssignDate(String date, int days) {
        Date dt = strToDate(date);
        Long _days = getDiffDays(dt);
        days = days + Integer.parseInt(_days.toString());

        return getPastDate(days);
    }

    /**
     * 获取未来 第 days 天的日期
     *
     * @param days 天数
     * @return "2018-08-28"
     */
    public static String getFetureDate(int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + days);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        return format.format(today);
    }

    /**
     * 获取过去几分钟的时间
     *
     * @param minutes 时间
     * @return "2018-08-28 19:04:25"
     */
    public static String getPastMinutesTime(Integer minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - minutes);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        return format.format(today);
    }

    /**
     * 获取指定时间过去几分钟
     *
     * @param date    时间
     * @param minutes 流失时间
     * @return 时间
     */
    public static String getPastMinutesTime(String date, Integer minutes) {
        Date dt = strToDate(date);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dt);
        calendar.add(Calendar.MINUTE, -minutes);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        return format.format(today);
    }

    /**
     * 指定时间增加/减去天数
     *
     * @param date   要计算的日期
     * @param amount 天数
     * @return 日期
     */
    public static Date dateComputeDays(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, amount);
        return calendar.getTime();
    }

    /**
     * Unix 时间转北京时间
     *
     * @param unixtime unix 时间
     * @param seconds  传入的数据精确到秒还是毫秒
     * @return "2018-08-28"
     */
    public static String UnixToDate(Long unixtime, Boolean seconds) {
        String formats = "yyyy-MM-dd HH:mm:ss";

        if (seconds) {
            unixtime = unixtime * 1000;
        }
        return new SimpleDateFormat(formats, Locale.CHINA).format(new Date(unixtime));
    }

    /**
     * 北京时间转 Unix 时间
     *
     * @param date 时间
     * @return unix 时间
     */
    public static Long DateToUnix(Date date) {
        return date.getTime();
    }

    /**
     * 时间字符串转 Unix 时间
     *
     * @param datestr 时间
     * @return unix 时间
     */
    public static Long StrDateToUnix(String datestr) {
        datestr = complementDate(datestr);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(datestr);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        if (date == null) {
            return 0L;
        } else {
            return date.getTime();
        }
    }


    /**
     * 简单粗暴的方法取出日期的小时：Hour
     * 必须是标准的日期字符串
     *
     * @param datestr 时间
     * @return 时间的小时部分
     */
    public static String GetHourSimple(String datestr) {
        if (datestr == null || datestr.equals("")) {
            return null;
        }

        String hour = datestr.split(" ")[1];
        hour = hour.split(":")[0];

        return hour;
    }

    /**
     * 简单粗暴的方法格式化日期：YYYYMMDD
     * 必须是标准的日期字符串
     *
     * @param datestr 时间
     * @return "20180728"
     */
    public static String GetFormatDateSimple(String datestr) {
        if (datestr == null || datestr.equals("")) {
            return null;
        }

        String dateStr = datestr.split(" ")[0];
        dateStr = dateStr.replace("/", "");
        dateStr = dateStr.replace("-", "");
        return dateStr;
    }

    /**
     * 补全日期
     *
     * @param datestr 日期
     * @return 完整的时间
     */
    static String complementDate(String datestr) {
        try {
            // 处理 "2018-11-06" 这种日期格式
            if (datestr.split(" ").length == 1) {
                return String.format("%s 00:00:00", datestr);
            }

            // 处理 "2018-11-06 10" 这种日期格式
            if (datestr.split(" ")[1].split(":").length == 1) {
                return datestr + ":00:00";
            }

            // 处理 "2018-11-06 10:45" 这种日期格式
            if (datestr.split(" ")[1].split(":").length == 2) {
                return datestr + ":00";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return datestr;
    }

    /**
     * 取出日期的时间部分
     *
     * @param date 日期
     * @return 时间部分
     */
    public static String getTimeFromDate(Date date) {
        try {
            String dateStr = dateToStr(date);
            return dateStr.split(" ")[1];
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 获取指定日期是星期几
     *
     * @param date 日期
     * @return 星期几
     */
    public static String getWeekForString(Date date) {
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];
    }

    /**
     * 获取指定日期是星期几
     *
     * @param date 日期
     * @return 数字星期几
     */
    public static Integer getWeekForInt(Date date) {
        Integer[] weekDays = {0, 1, 2, 3, 4, 5, 6};
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];
    }

    /**
     * 获取指定日期是星期几
     *
     * @param date 日期
     * @return 星期几
     */
    private static String getWeekForSimple(Date date) {
        SimpleDateFormat dateFm = new SimpleDateFormat("EEEE");
        return dateFm.format(date);
    }

    /**
     * 获取N天前是星期几
     *
     * @param days 天数
     * @return 星期几
     */
    private static String getPastWeek(int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days);
        Date today = calendar.getTime();
        return getWeekForSimple(today);
    }

    /**
     * 获取指定日期 过去第几天是星期几
     *
     * @param date 短日期
     * @param days 天数
     * @return 星期几
     */
    public static String getPastWeekForPastday(String date, int days) {
        Date dt = strToDate(date);
        Long _days = getDiffDays(dt);
        days = days + Integer.parseInt(_days.toString());

        return getPastWeek(days);
    }

    /**
     * 获取某年某月所有的工作日（不包含节假日）
     *
     * @param year  年
     * @param month 月
     * @return 工作日
     */
    public static String getMonthAllWorkDays(Integer year, Integer month) {

        int j = getCurrMonthDays(year, month);

        String day = "";
        Integer week = 0;
        StringBuilder allDays = new StringBuilder();

        for (int i = 1; i <= j; i++) {
            day = year + "-" + month + "-" + i;
            week = getWeekForInt(strToShortDate(day));
            if (week > 0 && week < 6) {
                allDays.append(",").append(i);
            }
        }

        return allDays.substring(1);
    }

    /**
     * 获取当月有多少天
     *
     * @param year  年
     * @param month 月
     * @return 天
     */
    public static Integer getCurrMonthDays(Integer year, Integer month) {
        if (month == 0) {
            return getCurrYearDays(year);
        }

        int j = 31;
        if (month == 2) {
            if (year % 4 == 0) {
                j = 29;
            } else {
                j = 28;
            }
        }
        if (month == 4 || month == 6 || month == 9 || month == 11) {
            j = 30;
        }

        return j;
    }

    /**
     * 获取当年有多少天
     *
     * @param year 年
     * @return 天
     */
    private static Integer getCurrYearDays(Integer year) {
        int j = 365;

        if (year % 4 == 0) {
            j = 366;
        }

        return j;
    }

    /**
     * 获取和今天相差几天
     *
     * @param date 要比较的日期
     * @return 正数表示日期小于今天，负数表示日期大于今天
     */
    public static Long getDiffDays(Date date) {
        return (new Date().getTime() - date.getTime()) / (24 * 60 * 60 * 1000);
    }

    //注意：小日期在前，大日期在后
    public static Long getDiffDays(Date dt1, Date dt2) {
        return (dt2.getTime() - dt1.getTime()) / (24 * 60 * 60 * 1000);
    }

    /**
     * 格式化日期为：yyyy-MM-dd HH:mm:ss
     *
     * @param dateStr 日期
     * @return 日期
     */
    public static String checkFormatDate(String dateStr) {

        if (StringUtils.isBlank(dateStr)) {
            // 空判断
            dateStr = "1990-01-01 00:00:00";
        } else {
            // 把 2018/10/1 0:00:00 日期转成 2018-10-1 0:00:00
            dateStr = dateStr.replace("/", "-");
        }

        // 处理 "2018-11-06" 短日期
        if (dateStr.length() == 10) {
            dateStr = String.format("%s 00:00:00", dateStr);
        }

        // 处理 "2018-11-06 10" 这种日期格式
        if (dateStr.length() == 13) {
            dateStr = dateStr + ":00:00";
        }

        // 处理 "2018-11-06 10:45" 这种日期格式
        if (dateStr.length() == 16) {
            dateStr = dateStr + ":00";
        }

        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date dt = format.parse(dateStr);
            dateStr = format.format(dt);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return dateStr;
    }

    /**
     * 判断日期为空的话 返回默认日期
     *
     * @param dateStr 日期
     * @return 日期
     */
    public static String checkEmptyDate(String dateStr) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        if (StringUtils.isBlank(dateStr)) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(1970, Calendar.FEBRUARY, 1, 0, 0, 0);
            dateStr = format.format(calendar.getTime());
        }

        return dateStr;
    }

    /**
     * 将 T1、T2...Tn 转化为相应的日期
     *
     * @param tdate 日期
     * @return 日期
     */
    public static String parserTDate(String tdate) {
        if (tdate.startsWith("T")) {
            int pastday = Integer.parseInt(tdate.replace("T", ""));
            return getPastDate(pastday);

        } else {
            tdate = tdate.replace("/", "-");
        }
        return tdate;
    }

    /**
     * 将长日期转化成：x年x月x日
     *
     * @param dateStr 长日期
     * @return x年x月x日
     */
    public static String dateToChineseShortStr(String dateStr) {
        dateStr = complementDate(dateStr);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = null;
        try {
            dt = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        return df.format(dt);
    }

    /**
     * 将长日期转化成：x年x月x日 x时x分x秒
     *
     * @param dateStr 长日期
     * @return x年x月x日 x时x分x秒
     */
    public static String dateToChineseStr(String dateStr) {
        dateStr = complementDate(dateStr);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = null;
        try {
            dt = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        return df.format(dt);
    }

    /**
     * 将 yyyy-MM-dd 格式转化成 MM/dd/yyyy 格式
     *
     * @param dateStr 日期
     * @return 日期
     */
    public static String dateFormatToItalic(String dateStr) {
        String formatStr = "";

        if (dateStr == null || dateStr.equals("")) {
            return formatStr;
        }

        String[] parts = dateStr.split("-");
        formatStr = String.format("%s/%s/%s", parts[1].trim(), parts[2].trim(), parts[0].trim());

        return formatStr;
    }

    /**
     * ES查询是 MM/dd/yyyy 这样的格式
     * 将 MM/dd/yyyy 格式转化成 yyyy-MM-dd 格式
     *
     * @param dateStr 日期
     * @return 日期
     */
    public static String dateFormatFromItalic(String dateStr) {
        String formatStr = "";

        if (dateStr == null || dateStr.equals("")) {
            return formatStr;
        }

        String[] parts = dateStr.split("/");
        formatStr = String.format("%s-%s-%s", parts[2].trim(), parts[0].trim(), parts[1].trim());

        return formatStr;
    }

    /**
     * 将 MM/dd/yyyy hh:mm:ss 格式转化成 yyyy-MM-dd hh:mm:ss 格式
     *
     * @param dateStr 日期
     * @return 日期
     */
    public static String datetimeFormatFromItalic(String dateStr) {
        String formatStr = "";

        if (dateStr == null || dateStr.equals("")) {
            return formatStr;
        }

        String[] parts = dateStr.split("/");
        formatStr = String.format("%s-%s-%s", parts[0].trim(), parts[1].trim(), parts[2].trim());

        return formatStr;
    }

    /**
     * 日期文件夹
     *
     * @param date 日期
     * @return 文件夹
     */
    public static String getDateFolder(Date date) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM");
        return df.format(new Date(date.getTime()));
    }

    //将时间戳转化为时间格式
    private static String timestampToStrDate(String dateStr) {
        if (dateStr.length() != 14) {
            return null;
        }

        String date = dateStr.substring(0, 4);
        date += "-" + dateStr.substring(4, 6);
        date += "-" + dateStr.substring(6, 8);
        date += " " + dateStr.substring(8, 10);
        date += ":" + dateStr.substring(10, 12);
        date += ":" + dateStr.substring(12, 14);

        return date;
    }

    //将时间戳转化为时间格式
    public static Date timestampToDate(String dateStr) {
        String date = timestampToStrDate(dateStr);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = null;
        try {
            dt = format.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return dt;
    }

    //获取日期列表
    public static List<String> getDateSrList(String endDate, int days) {
        List<String> dateList = new ArrayList<>();

        for (int i = days; i > 0; i--) {
            Date date = strToShortDate(endDate);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - (i - 1));
            date = calendar.getTime();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            dateList.add(format.format(date));
        }

        return dateList;
    }

    public static void main(String[] args) {
        System.out.println(strToDate("2021-06-29 11:17"));

        //System.out.println(getPastMinutesTime(30));

        /**
         System.out.println(timestampToStrDate("20210311170952"));
         System.out.println(timestampToDate("20210311170952"));
         */

        /***
         System.out.println(getPastDateAssignDate("2018-11-12", 3));
         System.out.println(getPastWeekForPastday("2018-11-12", 3));
         System.out.println("2018-11-12 12".length());
         */

        /***
         System.out.println(dateToChineseShortStr("2018-11-12 12:25:36"));
         System.out.println(dateToChineseStr("2018-11-12 12:25:36"));
         */

        /***
         String str = "2018/01/9";
         System.out.println(str.replace("/", "-"));
         System.out.println(str.replaceAll("/", "-"));
         */

        /***
         //Date date = new Date();

         //System.out.println("日期转字符串：" + DateToStr(date));
         //System.out.println("字符串转日期：" + StrToDate(DateToStr(date)));

         //System.out.println(getShortDateBeforeDays(3));
         //System.out.println(strToShortDate("2017-07-27 00:00:00"));
         */

        /**
         System.out.println(getWeekForInt(new Date()));
         System.out.println(getFetureDate(1));
         System.out.println(strToDate("1990-01-01"));
         */

        /**
         System.out.println(getPastDate(0));
         System.out.println(getPastDate(1));
         System.out.println(getPastDate(-1));
         System.out.println("****************************");
         System.out.println(getPastDateAssignDate("2019-10-19", 0));
         System.out.println(getPastDateAssignDate("2019-10-19", 1));
         System.out.println(getPastDateAssignDate("2019-10-19", -1));
         System.out.println("****************************");
         System.out.println(getFetureDate(0));
         System.out.println(getFetureDate(1));
         System.out.println(getFetureDate(-1));
         System.out.println(getFetureDate(2));
         */
    }
}
